;(async function () {
  // 1. 引入mongoose
  const mongoose = require('mongoose')

  // 2. 使用mongoose连接mongodb数据库软件
  const promise = mongoose.connect('mongodb://127.0.0.1:27017/web0302')

  try {
    await promise
    console.log('数据库连接成功了')
  } catch (error) {
    console.log('数据库连接失败了')
    return
  }

  // 3. 创建约束对象
  // 原因: mongodb添加数据非常灵活,可以任意的添加各种属性. 创建约束对象是为了约束添加的数据的属性以及属性的数据类型
  const Schema = mongoose.Schema
  //比如: {name:'zs',age:18,info:'介绍',createTime:Date.now()}
  // 注意: 具体再插入数据的时候,mongoose会自动进行数据类型转换.所以可能规定了Number类型,但是插入数据时写的是String类型也可以
  // 注意: 如果后期要改Schema,可能修改的Schema不会生效.所以需要先删除已经生成的集合,然后再重新添加数据,则新的规则就会生效了
  const schema = new Schema({
    name: {
      type: String, // 约束了name属性的数据类型,
      required: true, // 约束了name属性是必填
      unique: true, // name属性的值在当前集合中不能重复
    },
    age: {
      type: Number, // 约束了age属性的数据类型是数字,
      required: true, // 约束了age属性是必填
    },
    info: {
      type: String,
    },
    createTime: {
      type: Date,
      default: Date.now(), //默认值
    },
  })

  // 4. 创建集合对象
  // 往mongodb中插入数据或其他操作,都是在操作集合.所以要先创建集合对象,才能进行增删改查的操作
  // 注意: 如果当前数据库中没有指定的集合,则mongoose会自动帮我们创建这个集合. 而且如果集合名没有s,则会自动在集合名后面加s
  const userModel = mongoose.model('user', schema)

  // 5. 往集合中插入数据
  // 集合对象中提供的增删改查的方法也都是异步的对数据库进行操作
  // 注意: 集合对象中提供的增删改查的方法如果不写回调函数,则返回值是一个promise
  const result = userModel.create({
    name: 'ttt',
    age: 12,
  })
  // 获取promise成功的value属性的值
  const value = await result
  console.log(value)
})()
